/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.adama.bulletin;

import fr.adama.dto.BulletinPaieDTO;
import fr.adama.dto.ContratDTO;
import fr.adama.dto.LigneBulletinPaieModeleDTO;
import fr.adama.dto.ModelePaieDTO;
import fr.adama.exception.BulletinException;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author mini-john
 */
public class CalculBulletin {
    private static final Logger logger = LoggerFactory.getLogger(CalculBulletin.class);

    public static BulletinPaieDTO calculBulletin(BulletinPaieDTO bulletin, ModelePaieDTO modelPaie,ContratDTO contrat) throws BulletinException {
        logger.info("Calcul du bulletin du contrat.id={} pour la periode={}",contrat.getId(),bulletin.getPeriode());
        BigDecimal chargeSalarial = BigDecimal.ZERO, chargePatronal = BigDecimal.ZERO, montantImposable = BigDecimal.ZERO;
        BigDecimal salaireBrut = bulletin.getSalaireBrut(), nombreHeureTotal = bulletin.getNombreHeureTotal();
        
       
        for (LigneBulletinPaieModeleDTO ligne : modelPaie.getLigneBulletinPaieModele()) {

            //Calcul des charge patronal
            switch (ligne.getBaselignePaieSalariale()) {
                case AssieteCotisationBrut:
                    chargeSalarial = chargeSalarial.add(ligne.getMontantSalarial(salaireBrut));
                    break;
                case NombreHeureSansConge:
                    chargeSalarial = chargeSalarial.add(ligne.getMontantSalarial(nombreHeureTotal));
                    break;
                case Aucune:
                    break;
                default:
                    throw new BulletinException(ligne.getBaselignePaieSalariale() + "inconnu");
            }
            if (ligne.getChargeSalarialImposable()) {
                switch (ligne.getBaselignePaieSalariale()) {
                    case AssieteCotisationBrut:
                        montantImposable = montantImposable.add(ligne.getMontantSalarial(salaireBrut));
                        break;
                    case NombreHeureSansConge:
                        montantImposable = montantImposable.add(ligne.getMontantSalarial(nombreHeureTotal));
                        break;
                    case Aucune:
                        break;
                    default:
                        throw new BulletinException(ligne.getBaselignePaieSalariale() + "inconnu");
                }
            }
            switch (ligne.getBaselignePaiePatronal()) {
                case AssieteCotisationBrut:
                    chargePatronal = chargePatronal.add(ligne.getMontantPatronal(salaireBrut));
                    break;
                case NombreHeureSansConge:
                    chargePatronal = chargePatronal.add(ligne.getMontantPatronal(nombreHeureTotal));
                    break;
                case Aucune:
                    break;
                default:
                    throw new BulletinException(ligne.getBaselignePaiePatronal() + "inconnu");
            }

        }
        Calendar cal = GregorianCalendar.getInstance();
        cal.setTime(bulletin.getPeriode());
        bulletin.setMois(cal.get(Calendar.MONTH)+1);
        bulletin.setAnnee(cal.get(Calendar.YEAR));
        bulletin.setChargeSalarial(chargeSalarial);
        bulletin.setChargePatronale(chargePatronal);
        bulletin.setSalaireImposable(bulletin.getSalaireBrut().add(montantImposable).subtract(chargeSalarial).setScale(2, BigDecimal.ROUND_HALF_UP));
        BigDecimal salaireNetAPayer = bulletin.getSalaireBrut().subtract(chargeSalarial).subtract(bulletin.getaDeduire()).add(bulletin.getaPayer().setScale(2, BigDecimal.ROUND_HALF_UP));
        bulletin.setSalaireNetAPayer(salaireNetAPayer.setScale(2, BigDecimal.ROUND_HALF_UP));
        return bulletin;
    }
}
